/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.espe.ccsoft.mantenimiento.bean;

import ec.edu.espe.ccsoft.mantenimiento.modelos.DetalleMantenimiento;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Mantenimiento;
import ec.edu.espe.ccsoft.mantenimiento.modelos.ProgramacionMantenimiento;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Repuesto;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Subsistema;
import ec.edu.espe.ccsoft.mantenimiento.modelos.TipoActividad;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Unidad;
import ec.edu.espe.ccsoft.mantenimiento.servicios.DetalleMantenimientoServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.MantenimientoServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.ProgramacionMantenimientoServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.RepuestoServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.TipoActividadServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.UnidadServicio;
import ec.edu.espe.ccsoft.mantenimiento.utils.ManejoAcciones;
import ec.edu.espe.ccsoft.mantenimiento.utils.Mensajes;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Carlos
 */
@ManagedBean
@ViewScoped
public class MantenimientoBean extends ManejoAcciones implements Serializable {

    @EJB
    private MantenimientoServicio mantenimientoServicio;
    @EJB
    private DetalleMantenimientoServicio detalleMantenimientoServicio;
    @EJB
    private TipoActividadServicio tipoActividadServicio;
    @EJB
    private ProgramacionMantenimientoServicio programacionMantenimientoServicio;
    @EJB
    private RepuestoServicio repuestoServicio;

    private Mantenimiento mantenimiento;
    private List<Mantenimiento> mantenimientos;
    private DetalleMantenimiento detalleMantenimiento;
    private List<DetalleMantenimiento> detallesMantenimientos;
    private List<TipoActividad> tiposActividades;

    Subsistema subsistema;

    private Mensajes mensaje;

    @PostConstruct
    public void init() {
        mantenimientos = mantenimientoServicio.FindAllMantenimiento();
        detallesMantenimientos = new ArrayList();
        detalleMantenimiento = new DetalleMantenimiento();
        tiposActividades = new ArrayList();
        mensaje = new Mensajes();
    }

    public void cargarNuevo() {
        mantenimiento = new Mantenimiento();
        super.nuevoRegistro();
    }

    public void cargarModificar() {
        super.modificarRegistro();
        detallesMantenimientos = detalleMantenimientoServicio.FindByCodigoMantenimiento(mantenimiento.getCodMantenimiento());
    }

    public void cargarDetalle() {
        super.detallesRegistro();
    }

    public void cargarNuevoDetalle() {
        detalleMantenimiento = new DetalleMantenimiento();
    }

    public void finalizarManteniminto() {
        mantenimiento.setEstado(false);
        mantenimiento.setFechaSalida(Calendar.getInstance().getTime());
        mantenimientoServicio.updateMantenimiento(mantenimiento);
        mantenimientos.remove(mantenimiento);
        
        for (DetalleMantenimiento aux : detallesMantenimientos) {
            int num=aux.getRepuesto().getStock()-aux.getCantidad();
            Repuesto repuestoAux = repuestoServicio.FindByPk(aux.getRepuesto());
            repuestoAux.setStock(num);
            repuestoServicio.UpdateRepuesto(repuestoAux);
        }
        
        mensaje.addMessageSuccefull("Información", "El mantenimiento ha sido finalizado con éxito");
        RequestContext.getCurrentInstance().execute("PF('dlDetalleVar').hide();");
        RequestContext.getCurrentInstance().update("@form");
        
    }

    public void guardar() {
        try {

            mantenimiento.setKilometrajeActual(mantenimiento.getUnidad().getKilometraje());

            mantenimiento.setEstado(true);
            mantenimiento.setFechaCreacion(Calendar.getInstance().getTime());
            mantenimiento.setFechaIngreso(Calendar.getInstance().getTime());

            this.mantenimientoServicio.createMantenimiento(mantenimiento);
            mantenimientos.add(mantenimiento);

            mensaje.addMessageSuccefull("Información", "El mantenimiento ha sido creado con éxito");
            RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
            RequestContext.getCurrentInstance().update("@form");

        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al crear el Mantenimiento " + e.getMessage());
        }
    }

    public void agregarDetalle() {
        detalleMantenimiento.setMantenimiento(mantenimiento);
        detalleMantenimiento.setEstado(true);
        detalleMantenimiento.setFechaCreacion(Calendar.getInstance().getTime());

        detallesMantenimientos.add(detalleMantenimiento);

        detalleMantenimientoServicio.CreateCiudad(detalleMantenimiento);
        mensaje.addMessageSuccefull("Información", "El detalle ha sido agregado con éxito");
        RequestContext.getCurrentInstance().execute("PF('dlEleccionVar').hide();");
        RequestContext.getCurrentInstance().update("@form");

        ProgramacionMantenimiento programacionMantenimiento = new ProgramacionMantenimiento();
        programacionMantenimiento.setUnidad(mantenimiento.getUnidad());
        programacionMantenimiento.setEstado(true);
        programacionMantenimiento.setFechaCreacion(Calendar.getInstance().getTime());
        programacionMantenimiento.setNombre(detalleMantenimiento.getTipoActividad().getNombre() + "/" + detalleMantenimiento.getTipoActividad().getSubsistema().getNombre());
        BigInteger proxKilometro = detalleMantenimiento.getRendimientoEsperado()
                .add(BigInteger.valueOf(mantenimiento.getUnidad().getKilometraje()));
        programacionMantenimiento.setProximoMantenimiento(proxKilometro.longValue());
        programacionMantenimientoServicio.CreateProgramacion(programacionMantenimiento);

        subsistema = new Subsistema();
        detalleMantenimiento = new DetalleMantenimiento();

    }

    public void modificar() {
        try {
            mantenimientoServicio.updateMantenimiento(mantenimiento);
            if (!mantenimiento.getEstado()) {
                mantenimientos.remove(mantenimiento);
                mensaje.addMessageSuccefull("Información", "El mantenimiento ha sido eliminado con éxito");
            } else {
                mensaje.addMessageSuccefull("Información", "El mantenimiento ha sido modificado con éxito");
            }
            RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
            RequestContext.getCurrentInstance().update("@form");
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al modificar el mantenimiento " + e.getMessage());
        }
    }

    public Mantenimiento getMantenimiento() {
        return mantenimiento;
    }

    public void setMantenimiento(Mantenimiento mantenimiento) {
        this.mantenimiento = mantenimiento;
    }

    public List<Mantenimiento> getMantenimientos() {
        return mantenimientos;
    }

    public void setMantenimientos(List<Mantenimiento> mantenimientos) {
        this.mantenimientos = mantenimientos;
    }

    public DetalleMantenimiento getDetalleMantenimiento() {
        return detalleMantenimiento;
    }

    public void setDetalleMantenimiento(DetalleMantenimiento detalleMantenimiento) {
        this.detalleMantenimiento = detalleMantenimiento;
    }

    public List<DetalleMantenimiento> getDetallesMantenimientos() {
        return detallesMantenimientos;
    }

    public void setDetallesMantenimientos(List<DetalleMantenimiento> detallesMantenimientos) {
        this.detallesMantenimientos = detallesMantenimientos;
    }

    public List<TipoActividad> getTiposActividades() {
        if (subsistema != null) {
            tiposActividades = tipoActividadServicio.FindBySubsistema(subsistema.getCodSubsistema());
        }
        return tiposActividades;
    }

    public void setTiposActividades(List<TipoActividad> tiposActividades) {
        this.tiposActividades = tiposActividades;
    }

    public Subsistema getSubsistema() {
        return subsistema;
    }

    public void setSubsistema(Subsistema subsistema) {
        this.subsistema = subsistema;
    }

}
